home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 17 / AMIGAplus Sonderheft 17 (1999)(ICP)(DE)[!].iso / Rexx / SaveNets.AmiCAD < prev    next >
Text File  |  1998-08-08  |  9KB  |  369 lines

  1. /* Élaboration d'une netlist */
  2. /* $VER: SaveNets 1.0 (© R.Florac, 14-07-98) */
  3. /* Ne teste que les lignes horizontales ou verticales (pour les intersections) */
  4.  
  5. options results     /* indispensable pour récupérer le résultat des macros */
  6.  
  7. signal on error     /* pour l'interception des erreurs */
  8. signal on syntax
  9.  
  10. /* Test des liaisons */
  11. j=1; nets=1;
  12. 'DEF NEXTJUNCTION(O)=OO=O:WHILE(IF(OO>0,TYPE(OO)<>7,0),IF(OO<OBJECTS(-1),OO=OO+1,OO=0)):OO'
  13. 'UNMARK(-1):LOCK(-1):OBJECTS(-1)'; objets=result
  14. /* Tableaux de données:
  15. equi: une donnée par élément, donne l'indice de l'équipotentielle à laquelle est liée une ligne
  16. label: une donnée par équipotentielle, donne son nom */
  17. equi.=-1
  18. label.=""
  19.  
  20. 'TITLE("Lecture des labels...")'
  21. do i=1 to objets
  22.     'TYPE(O='i')'
  23.     if result=4 | result=12 | result=11 then do
  24.     'ABS(FINDLINE(1,COL(O),LINE(O)))'; j=result
  25.     if j>0 then do
  26.         'READTEXT(O)'; label=result
  27.         if datatype(label,"w") then do      /* signale les labels numériques existants */
  28.         label.label="LABEL_DÉJÀ_UTILISÉ"
  29.         end
  30.     end
  31.     end
  32. end
  33.  
  34. 'TITLE("Analyse des liaisons...")'
  35. i=1
  36. do while i>0
  37.     'OO=FINDOBJ('i',2,-1,-1)'; i=result
  38.     if result>0 then do
  39.     'TEST(OO)'
  40.     if result=0 then do
  41.         do while label.nets~=""
  42.         nets=nets+1
  43.         end
  44.         label.nets=nets
  45.         equi.i=nets
  46.         'COORDS(OO)'            /* Marquage du fil */
  47.         parse var result x0','y0','x1','y1
  48.         call test_ligne(x0,y0,nets,objets)
  49.         call test_ligne(x1,y1,nets,objets)
  50.     end
  51.     if i=objets then i=0
  52.     else i=i+1
  53.     end
  54. end
  55.  
  56. 'TITLE("Analyse des jonctions...")'
  57. i=1
  58. do while i>0
  59.     'I=FINDOBJ('i',7,-1,-1)'; i=result
  60.     if i>0 then do
  61.     'MARK(I):L1=ABS(FINDLINE(1,COL(I),LINE(I)))'; l1=result
  62.     if l1>0 & l1<objets then do
  63.         j=l1+1
  64.         do while j>0
  65.         'J=ABS(FINDLINE('j',COL(I),LINE(I)))'; j=result
  66.         if j>0 then do
  67.             if equi.j~=equi.l1 then do
  68.             call changer_labels(l1,j)
  69.             end
  70.             if j=objets then j=0
  71.             else j=j+1
  72.         end
  73.         end
  74.     end
  75.     if i=objets then i=0
  76.     else i=i+1
  77.     end
  78. end
  79.  
  80. 'TITLE("Recherche des labels et des connecteurs...")'
  81. do i=1 to objets
  82.     'TYPE(O='i')'
  83.     if result=4 | result=12 | result=11 then do
  84.     'ABS(FINDLINE(1,COL(O),LINE(O)))'; j=result
  85.     if j>0 then do
  86.         net=equi.j
  87.         'READTEXT(O)'; label=result
  88.         label.net=label
  89.     end
  90.     end
  91. end
  92.  
  93. 'TITLE("Recherche des alimentations...")'
  94. do i=1 to objets
  95.     'FINDPART('i',"ALIMENTATION")'; i=result
  96.     if i>0 then do
  97.     j=connexion_broche(i,1)
  98.     if j>0 then do
  99.         net=equi.j
  100.         'READTEXT(GETVAL('i'))'; label=result
  101.         label.net=label
  102.     end
  103.     end
  104.     else leave
  105. end
  106.  
  107. 'TITLE("Test redondances...")'
  108. do i=1 to nets
  109.     do j=i+1 to nets
  110.     if label.j~="" then do
  111.         if label.i=label.j then do
  112.         do k=1 to objets
  113.             if equi.k=j then equi.k=i
  114.         end
  115.         label.j=""
  116.         end
  117.     end
  118.     end
  119. end
  120.  
  121. 'TITLE("Recherche des masses...")'
  122. do i=1 to objets
  123.     'FINDPART('i',"MASSE")'; i=result
  124.     if i>0 then do
  125.     j=connexion_broche(i,1)
  126.     if j>0 then do
  127.         equi.0=0; label.0=0
  128.         call changer_labels(0,j)
  129.     end
  130.     end
  131.     else leave
  132. end
  133.  
  134. do until c=0
  135.     'TITLE("Établissement équipotentielles terminé"):SELECT("Choisissez une action"+CHR(10)+"Visualiser les équipotentielles"+CHR(10)+"Contrôler la netlist"+CHR(10)+"Sauver la netlist"+CHR(10)+"Abandonner ce script")'
  136.     select
  137.     when result=1 then call visu_equi
  138.     when result=2 then call controler_netlist
  139.     when result=3 then call sauver_netlist
  140.     otherwise c=0
  141.     end
  142. end
  143. exit
  144.  
  145. visu_equi:
  146.     'TITLE("Vérification équipotentielles"):UNMARK(-1)'
  147.     do i=0 to nets
  148.     if label.i ~= "LABEL_DÉJÀ_UTILISÉ" & label.i ~= "" then do
  149.         do j=1 to objets
  150.         if equi.j=i then 'MARK('j')'
  151.         end
  152.         'SELECT("Équipotentielle 'label.i'"+CHR(10)+"Abandonner"+CHR(10)+"Continuer"+CHR(10)+"Sauver netlist"+CHR(10)+"Contrôler netlist")'
  153.         if result <= 1 then return
  154.         if result = 3 then do
  155.         call sauver_netlist
  156.         exit
  157.         end
  158.         if result = 4 then do
  159.         call controler_netlist
  160.         leave
  161.         end
  162.         'UNMARK(-1)'
  163.     end
  164.     end
  165.     return
  166.  
  167. test_ligne: procedure expose equi.
  168.     parse arg x0,y0,n,nbo
  169.     o=1
  170.     do until o=0
  171.     'X=FINDOBJ('o',2,'x0','y0')'; o=result
  172.     if o>0 then do
  173.         'IF(TEST(X),"",MARK(X):COORDS(X))'
  174.         if result~="" then do
  175.         parse var result x1','y1','x2','y2
  176.         equi.o=n
  177.         if x0=x1 & y0=y1 then call test_ligne(x2,y2,n,nbo)
  178.         else call test_ligne(x1,y1,n,nbo)
  179.         end
  180.         if o=nbo then o=0
  181.         else o=o+1
  182.     end
  183.     end
  184.     return
  185.  
  186. changer_labels: procedure expose equi. objets label.
  187.     parse arg o1,o2
  188.     if datatype(equi.o2,'w') then do
  189.     e=equi.o2
  190.     label.e=""
  191.     do i=1 to objets
  192.         if equi.i=e then equi.i=equi.o1
  193.     end
  194.     return o1
  195.     end
  196.     else do
  197.     e=equi.o1
  198.     label.e=""
  199.     do i=1 to objets
  200.         if equi.i=e then equi.i=equi.o2
  201.     end
  202.     return o2
  203.     end
  204.     return
  205.  
  206. test_jonction: procedure expose equi.
  207.     parse arg xj,yj,n,objets
  208.     obj=1
  209.     do while obj>0
  210.     'X=ABS(FINDLINE('obj','xj','yj'))'; obj=result
  211.     if obj>0 then do
  212.         if equi.obj=n then return 1
  213.         if obj=objets then return 0
  214.         obj=obj+1
  215.     end
  216.     end
  217.     return 0
  218.  
  219. controler_netlist:
  220.     'TITLE("Contrôle netlist...")'
  221.     i=1
  222.     do while i>0
  223.     'O=FINDOBJ('i',1,-1,-1)'; i=result
  224.     if i>0 then do
  225.         'PARTNAME(O)'
  226.         if result~="ALIMENTATION" & result ~="MASSE" then do
  227.         'IF(GETREF(O),READTEXT(GETREF(O)),PARTNAME(O)+"?")'
  228.         ligne=translate(result,"_"," ")||' '
  229.         'DEVPINS(O)'; j=result
  230.         do k=1 to j
  231.             l=connexion_broche(i,k)
  232.             if l>0 then do
  233.             net=equi.l
  234.             ligne=ligne||label.net||' '
  235.             end
  236.             else ligne=ligne||"-1"||' '
  237.         end
  238.         'IF(GETVAL(O),READTEXT(GETVAL(O)),PARTNAME(O))'
  239.         ligne=ligne||result
  240.         'UNMARK(-1):MARK(O):SELECT("'ligne'"+CHR(10)+"Continuer"+CHR(10)+"Abandonner")'
  241.         if result~=1 then return
  242.         end
  243.         if i=objets then leave
  244.         i=i+1
  245.     end
  246.     end
  247.     'TITLE("")'
  248. return
  249.  
  250. sauver_netlist:
  251.     'TITLE(""):REQFILE("Fichier netlist à créer","Spice")'
  252.     fichier=result
  253.     if fichier="" then return
  254.     'TITLE("Sauvegarde netlist...")'
  255.     if ~open(file, fichier, 'W') then return
  256.     'FILEPART("")'
  257.     writeln(file,result)
  258.     'DATE(1)+" à "+TIME(1)'
  259.     writeln(file,"* Créé par AmiCAD, le "||result||" *")
  260.     do i=1 to objets
  261.     'O=FINDOBJ('i',1,-1,-1)'; i=result
  262.     if result>0 then do
  263.         'PARTNAME(O)'
  264.         if result~="ALIMENTATION" & result ~="MASSE" then do
  265.         'IF(GETREF(O),READTEXT(GETREF(O)),PARTNAME(O)+"?")'
  266.         ligne=translate(result,"_"," ")||' '
  267.         'DEVPINS(O)'; j=result
  268.         do k=1 to j
  269.             l=connexion_broche(i,k)
  270.             if l>0 then do
  271.             net=equi.l
  272.             ligne=ligne||label.net||' '
  273.             end
  274.             else ligne=ligne||"-1"||' '
  275.         end
  276.         'IF(GETVAL(O),READTEXT(GETVAL(O)),PARTNAME(O))'
  277.         ligne=ligne||result
  278.         call writeln(file, ligne)
  279.         end
  280.     end
  281.     else leave i
  282.     end
  283.     analyse=""
  284.     do i=1 to objets
  285.     'FINDOBJ('i',4,-1,-1)'; i=result
  286.     if i>0 then do
  287.         'READTEXT('i')'; t=result
  288.         if left(t,10)=".ANALYSE: " then do
  289.         analyse=right(t,length(t)-10)
  290.         end
  291.     end
  292.     else leave
  293.     end
  294.     if analyse="" then do
  295.     'SELECT("Type d''analyse à effectuer"+CHR(10)+"AC"+CHR(10)+"DC"+CHR(10)+"Transient")'
  296.     select
  297.         when result=1 then do
  298.         'SELECT("Type de variation"+CHR(10)+"Décade"+CHR(10)+"Octave"+CHR(10)+"Linéaire")'
  299.         select
  300.             when result=1 then do
  301.             f="DEC "; v="par décade"
  302.             end
  303.             when result=2 then do
  304.             f="OCT "; v="par octave"
  305.             end
  306.             when result=3 then do
  307.             f="LIN "; v="de test"
  308.             end
  309.             otherwise do
  310.             close(file)
  311.             return
  312.             end
  313.         end
  314.         'ASK("Nombre de points 'v'?")'
  315.         f=f||result
  316.         'ASK("Quelle est la fréquence de début?")'
  317.         f=f||" "||result
  318.         'ASK("Quelle est la fréquence de fin?")'
  319.         analyse="AC "||f||' '||result
  320.         end
  321.         when result=2 then do
  322.         'ASK("Quel est le nom du générateur à faire varier.")'
  323.         f=result
  324.         'ASK("Quelle est la valeur de départ?")'
  325.         f=f||' '||result
  326.         'ASK("Quelle est la valeur finale.")'
  327.         f=f||' '||result
  328.         'ASK("Quel est l''incrément?")'
  329.         analyse="DC "||f||' '||result
  330.         end
  331.         when result=3 then do
  332.         'ASK("Temps de simulation?")'; temps=result
  333.         'ASK("Pas de simulation?")'; pas=result
  334.         'ASK("Temps de début de la simulation?")'; d=result
  335.         analyse="tran "||pas||" "||temps||" "||d
  336.         end
  337.         otherwise
  338.         return
  339.     end
  340.     end
  341.     if analyse~="" then writeln(file,"."||analyse)
  342.     writeln(file,".END")
  343.     close(file)
  344.     'MESSAGE("Sauvegarde terminée")'
  345.     'TITLE("")'
  346. return
  347.  
  348. connexion_broche: procedure
  349.     parse arg objet,broche
  350.     'PINCOL(O='objet',B='broche')'; xj=result
  351.     'PINLINE(O,B)'; yj=result
  352.     'FINDOBJ(1,2,'xj','yj')'; xl=result     /* Il y a t'il une ligne qui part de la broche? */
  353.     if xl>0 then return xl
  354.     'FINDLINE(1,'xj','yj')'; xl=result      /* Il y a peut être une ligne qui passe sur la broche... */
  355.     if xl<=0 then return 0
  356.     'FINDOBJ(1,7,'xj','yj')'                /* Il doit alors y avoir une jonction */
  357.     if result>0 then return xl
  358.     return 0
  359.  
  360. /* Traitement des erreurs, interruption du programme */
  361. syntax:
  362. erreur=RC
  363. 'MESSAGE("Script SaveNets.AmiCAD"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'")'
  364. exit
  365.  
  366. error:
  367. 'MESSAGE("Script SaveNets.AmiCAD"+CHR(10)+"Erreur en ligne 'SIGL'")'
  368. exit
  369.